package com.own.component.util.excel.util.read.method;

import com.own.component.util.excel.util.read.base.BaseExcelReadConfig;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;

import java.util.ArrayList;
import java.util.List;
import java.util.function.Function;

/**
 * FiledListMethod
 *
 * @author chenxueli
 * @date 2022-10-08 16:57:00
 */
public class RowMethod {

    /**
     * 获取批注信息
     *
     * @param row 行信息
     * @return 备注列表
     */
    public static List<String> listRowComment(Row row) {
        return listValue(row, CellMethod::getComment);
    }

    /**
     * 获取批注信息
     *
     * @param row      行信息
     * @param config   配置信息
     * @param <T>      泛型
     * @param <CONFIG> 配置信息泛型
     * @return 备注列表
     */
    public static <T, CONFIG extends BaseExcelReadConfig<T>> List<String> listRowComment(Row row, CONFIG config) {
        return listValue(row, cell -> CellMethod.getComment(cell, config));
    }

    /**
     * 获取单元格信息
     *
     * @param row 行信息
     * @return 单元格值列表
     */
    public static List<String> listRowValue(Row row) {
        return listValue(row, CellMethod::getValue);
    }

    /**
     * 获取单元格信息
     *
     * @param row      行信息
     * @param config   配置信息
     * @param <T>      泛型
     * @param <CONFIG> 配置信息泛型
     * @return 单元格值列表
     */
    public static <T, CONFIG extends BaseExcelReadConfig<T>> List<String> listRowValue(Row row, CONFIG config) {
        return listValue(row, cell -> CellMethod.getValue(cell, config));
    }

    /**
     * 获取单元格信息
     *
     * @param row 行信息
     * @param fun 获取值的方法
     * @return 单元格值列表
     */
    public static List<String> list(Row row, Function<Cell, String> fun) {
        return listValue(row, fun);
    }

    /**
     * 获取值列表信息
     *
     * @param row 行信息
     * @param fun 获取值方法
     * @return 值列表
     */
    private static List<String> listValue(Row row, Function<Cell, String> fun) {
        var valueList = new ArrayList<String>();
        if (row == null) {
            return valueList;
        }
        for (int i = 0; i < row.getLastCellNum(); ++i) {
            var cell = row.getCell(i);
            valueList.add(fun.apply(cell));
        }
        return valueList;
    }

}
